//---------------------------------------------------------------------------

#ifndef NodoH
#define NodoH
//---------------------------------------------------------------------------
template<class TipoDatos>
class Nodo{
    public:
        Nodo();
        Nodo(TipoDatos *datos);
        Nodo(Nodo*ant, Nodo *sig,TipoDatos *datos);
        ~Nodo();
        TipoDatos *getValor();
        void setValor(TipoDatos* datos);
        Nodo<TipoDatos>* getAnterior();
        void setAnterior(Nodo * ant);
        Nodo<TipoDatos>* getSiguiente();
        void setSiguiente(Nodo * sig);

    private:
        Nodo* anterior;
        Nodo * siguiente;
        TipoDatos  *valor;
};


template<class TipoDatos>
Nodo<TipoDatos>::Nodo(){
    anterior=NULL;
    siguiente=NULL;
    valor=new TipoDatos();
}

template<class TipoDatos>
Nodo<TipoDatos>::Nodo(TipoDatos *datos){
    anterior=NULL;
    siguiente=NULL;
    valor=datos;
}

template<class TipoDatos>
Nodo<TipoDatos>::Nodo(Nodo*ant, Nodo *sig,TipoDatos *datos){
    anterior=ant;
    siguiente=sig;
    valor=datos;
}

template<class TipoDatos>
Nodo<TipoDatos>::~Nodo(){
    delete (TipoDatos*)valor;
}

template<class TipoDatos>
TipoDatos * Nodo<TipoDatos>::getValor(){
    return valor;
}

template<class TipoDatos>
void Nodo<TipoDatos>::setValor(TipoDatos* datos){
    valor=datos;
}

template<class TipoDatos>
Nodo<TipoDatos>* Nodo<TipoDatos>::getAnterior(){
    return anterior;
}

template<class TipoDatos>
void Nodo<TipoDatos>::setAnterior(Nodo * ant){
    anterior=ant;
}

template<class TipoDatos>
Nodo<TipoDatos>* Nodo<TipoDatos>:: getSiguiente(){
    return siguiente;
}

template<class TipoDatos>
void Nodo<TipoDatos>::setSiguiente(Nodo * sig){
    siguiente=sig;
}
#endif
